package com.scloud.scloudextends.sigar;

import com.scloud.scloudextends.vo.CpuVO;
import com.scloud.scloudextends.vo.MemoryVO;
import org.hyperic.sigar.*;

import java.util.ArrayList;
import java.util.List;


public class SigarLocalDeviceDataAcquisition {

    public static Sigar sigar;

    static {
        sigar = new Sigar();
    }

    /**
     * 采集本地设备内存数据
     */
    public static MemoryVO getMemory() throws SigarException {

        // 获取内存数据
        Mem mem = sigar.getMem();
        // 内存总容量
        long memTotal = mem.getTotal();
        // 内存使用量
        long memUsed = mem.getUsed();
        // 内存空闲量
        long memFree = mem.getFree();

        // 获取内存交换区数据
        Swap swap = sigar.getSwap();
        // 交换区总容量
        long swapTotal = swap.getTotal();
        // 交换区使用量
        long swapUsed = swap.getUsed();
        // 交换区剩余量
        long swapFree = swap.getFree();

        MemoryVO memoryVO = new MemoryVO();
        // 除以1024，将原始数据单位变成 /k
        memoryVO.setMemTotal(memTotal / 1024L);
        memoryVO.setMemUsed(memUsed / 1024L);
        memoryVO.setMemFree(memFree / 1024L);
        memoryVO.setSwapTotal(swapTotal / 1024L);
        memoryVO.setSwapUsed(swapUsed / 1024L);
        memoryVO.setSwapFree(swapFree / 1024L);

        return memoryVO;
    }

    /**
     * 采集本地设备CPU数据
     */
    public static CpuVO getCpu() throws SigarException {
        // 获取设备总CPU数据
        CpuPerc cpuPerc = sigar.getCpuPerc();
        return cpuFormat(cpuPerc);
    }

    /**
     * 采集本地设备所有CPU数据
     */
    public static List<CpuVO> getCpuList() throws SigarException {
        List<CpuVO> cpuVOS = new ArrayList<>();

        // 获取设备所有CPU数据
        CpuPerc[] cpuPercList = sigar.getCpuPercList();
        for (CpuPerc cpuPerc : cpuPercList) {
            cpuVOS.add(cpuFormat(cpuPerc));
        }
        return cpuVOS;
    }


    /**
     * 采集本地设备所有网络数据
     */
    public static void getNetwork() throws SigarException {
        // 获取所有网络设备名称
        String[] netInterfaceList = sigar.getNetInterfaceList();
        for (String netInterface : netInterfaceList) {
            // 按照名称查询所属数据
            NetInterfaceConfig netInterfaceConfig = sigar.getNetInterfaceConfig(netInterface);

            // IP地址
            String address = netInterfaceConfig.getAddress();
            // 子网掩码
            String netmask = netInterfaceConfig.getNetmask();

            NetInterfaceStat netInterfaceStat = sigar.getNetInterfaceStat(netInterface);
            // 接收的总包数量
            long rxPackets = netInterfaceStat.getRxPackets();
            // 发送的总包数量
            long txPackets = netInterfaceStat.getTxPackets();
            // 接收的总字节数量
            long rxBytes = netInterfaceStat.getRxBytes();
            // 发送的总字节数量
            long txBytes = netInterfaceStat.getTxBytes();
            // 接收的错误包数量
            long rxErrors = netInterfaceStat.getRxErrors();
            // 发送的错误包数量
            long txErrors = netInterfaceStat.getTxErrors();
            // 接收时丢包数量
            long rxDropped = netInterfaceStat.getRxDropped();
            // 发送时丢包数量
            long txDropped = netInterfaceStat.getTxDropped();
        }
    }
    /**
     * CPU数据返回值格式化
     * */
    private static CpuVO cpuFormat(CpuPerc cpuPerc) {
        // 用户使用率
        String cpuUser = CpuPerc.format(cpuPerc.getUser());  // CpuPerc.format() 此方法是将采集到的原始数据 计算成带 % 的使用率
        // 系统使用率
        String cpuSys = CpuPerc.format(cpuPerc.getSys());
        // 当前等待率
        String cpuWait = CpuPerc.format(cpuPerc.getWait());
        // 当前错误率
        String cpuNice = CpuPerc.format(cpuPerc.getNice());
        // 当前空闲率
        String cpuIdle = CpuPerc.format(cpuPerc.getIdle());
        // 当前使用率
        String cpuCombined = CpuPerc.format(cpuPerc.getCombined());


        CpuVO cpuVO = new CpuVO();
        // 将String类型的数据 转换为Double类型的数据。(个人项目需求 <非必要>)
        cpuVO.setUser(Double.parseDouble(cpuUser.replace("%","")));
        cpuVO.setSys(Double.parseDouble(cpuSys.replace("%","")));
        cpuVO.setWait(Double.parseDouble(cpuWait.replace("%","")));
        cpuVO.setNice(Double.parseDouble(cpuNice.replace("%","")));
        cpuVO.setIdle(Double.parseDouble(cpuIdle.replace("%","")));
        cpuVO.setCombined(Double.parseDouble(cpuCombined.replace("%","")));

        return cpuVO;
    }
}
